package com.gzc.just.play.last.war.common.serializer;

import java.util.HashMap;
import java.util.Map;
import java.util.ServiceLoader;

/**
 * 消息反序列化器工厂抽象类
 * 使用注册表而不是switch-case来存储和查找反序列化器
 * 支持注解驱动的自动注册
 */
public abstract class MessageDeserializerFactory {
    private static final Map<String, MessageDeserializerFactory> factories = new HashMap<>();
    
    /**
     * 注册工厂实例
     * @param moduleName 模块名称
     * @param factory 工厂实例
     */
    public static void registerFactory(String moduleName, MessageDeserializerFactory factory) {
        factories.put(moduleName, factory);
    }
    
    /**
     * 获取指定模块的工厂
     * @param moduleName 模块名称
     * @return 工厂实例
     */
    public static MessageDeserializerFactory getFactory(String moduleName) {
        return factories.get(moduleName);
    }
    
    /**
     * 自动发现并注册工厂
     */
    public static void discoverFactories() {
        ServiceLoader<MessageDeserializerFactory> loader = 
            ServiceLoader.load(MessageDeserializerFactory.class);
        
        for (MessageDeserializerFactory factory : loader) {
            registerFactory(factory.getModuleName(), factory);
        }
    }
    
    /**
     * 获取模块名称
     * @return 模块名称
     */
    public abstract String getModuleName();
    
    /**
     * 创建消息反序列化器
     * @param messageId 消息ID
     * @return 反序列化器，如果不支持则返回null
     */
    public <T> MessageDeserializer<T> createDeserializer(int messageId) {
        return MessageDeserializerRegistry.getDeserializer(getModuleName(), messageId);
    }
    
    /**
     * 获取支持的所有消息ID
     * @return 消息ID数组
     */
    public int[] getSupportedMessageIds() {
        return MessageDeserializerRegistry.getSupportedMessageIds(getModuleName());
    }
    
    /**
     * 检查是否支持指定ID的消息
     * @param messageId 消息ID
     * @return 是否支持
     */
    public boolean supportsMessage(int messageId) {
        return MessageDeserializerRegistry.supportsMessage(getModuleName(), messageId);
    }
}